{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 7 - Distributional Q-learning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18.4\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "probs = np.array([0.6, 0.1, 0.1, 0.1, 0.1])\n",
    "outcomes = np.array([18, 21, 17, 17, 21])\n",
    "expected_value = 0.0\n",
    "for i in range(probs.shape[0]):\n",
    "    expected_value += probs[i] * outcomes[i]\n",
    "\n",
    "print(expected_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18.4\n"
     ]
    }
   ],
   "source": [
    "expected_value = probs @ outcomes\n",
    "print(expected_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([19.24612582])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t0 = 18.4\n",
    "T = lambda: t0 + np.random.randn(1)\n",
    "T()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 51 artists>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "vmin,vmax = -10.,10. #A\n",
    "nsup=51 #B\n",
    "support = np.linspace(vmin,vmax,nsup) #C\n",
    "probs = np.ones(nsup)\n",
    "probs /= probs.sum()\n",
    "z3 = torch.from_numpy(probs).float()\n",
    "plt.bar(support,probs) #D"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_dist(r,probs,lim=(-10.,10.),gamma=0.8):\n",
    "    nsup = probs.shape[0]\n",
    "    vmin,vmax = lim[0],lim[1]\n",
    "    dz = (vmax-vmin)/(nsup-1.) #A\n",
    "    bj = np.round((r-vmin)/dz) #B\n",
    "    bj = int(np.clip(bj,0,nsup-1)) #C\n",
    "    m = probs.clone()\n",
    "    j = 1\n",
    "    for i in range(bj,1,-1): #D\n",
    "        m[i] += np.power(gamma,j) * m[i-1]\n",
    "        j += 1\n",
    "    j = 1\n",
    "    for i in range(bj,nsup-1,1): #E\n",
    "        m[i] += np.power(gamma,j) * m[i+1]\n",
    "        j += 1\n",
    "    m /= m.sum() #F\n",
    "    return m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784, 0.01960784, 0.01960784, 0.01960784, 0.01960784,\n",
       "       0.01960784])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "probs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 51 artists>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ob_reward = -1\n",
    "Z = torch.from_numpy(probs).float()\n",
    "Z = update_dist(ob_reward,torch.from_numpy(support).float(),Z,lim=(vmin,vmax),gamma=0.1)\n",
    "plt.bar(support,Z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 51 artists>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ob_rewards = [10,10,10,0,1,0,-10,-10,10,10]\n",
    "for i in range(len(ob_rewards)):\n",
    "    Z = update_dist(ob_rewards[i], torch.from_numpy(support).float(), Z, lim=(vmin,vmax), gamma=0.5)\n",
    "plt.bar(support, Z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 51 artists>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAeDklEQVR4nO3df0zchf3H8ReHclhbrq3Y48dOsdZfnSsolBMXv7rslLjGrMlmmHHCiGsyVzvn6SJMC9Zfh1Y7NstkmnUajZPNqFvWBuMumsX0JhmsmTpbrROptndAunIVI+jd5/uH7jpWaDmgfffo85F8Evnw+XzufTnPe/q5zx1ZjuM4AgAAMOKyHgAAABzfiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGDqBOsBJiOZTGr37t2aN2+esrKyrMcBAACT4DiO9u/fr6KiIrlcE5//yIgY2b17t3w+n/UYAABgCnbt2qUvfelLE/4+I2Jk3rx5kj6/M3l5ecbTAACAyYjH4/L5fKnX8YlkRIz8562ZvLw8YgQAgAxzuEssuIAVAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAICpE6wHAAAc20oaNk/7GL0tK2ZgEsxWnBkBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgakox0tbWppKSEuXm5srv96urq+uQ2+/bt0+rV69WYWGh3G63zj77bG3ZsmVKAwMAgNkl7b/a29HRoWAwqPb2dvn9frW2tqq6ulo7duzQokWLDtp+dHRUl19+uRYtWqRnn31WxcXFev/99zV//vyZmB8AAGS4tGNkw4YNWrVqlerr6yVJ7e3t2rx5szZt2qSGhoaDtt+0aZP27t2rrVu36sQTT5QklZSUTG9qAAAwa6T1Ns3o6Ki6u7sVCAQOHMDlUiAQUCQSGXefP/7xj6qqqtLq1avl9Xp1/vnn67777lMikZjwdkZGRhSPx8csAABgdkorRgYHB5VIJOT1eses93q9ikaj4+7zr3/9S88++6wSiYS2bNmitWvX6qGHHtI999wz4e2EQiF5PJ7U4vP50hkTAABkkCP+aZpkMqlFixbp0UcfVXl5uWpqanT77bervb19wn0aGxs1NDSUWnbt2nWkxwQAAEbSumYkPz9f2dnZisViY9bHYjEVFBSMu09hYaFOPPFEZWdnp9add955ikajGh0dVU5OzkH7uN1uud3udEYDAAAZKq0zIzk5OSovL1c4HE6tSyaTCofDqqqqGnefr371q9q5c6eSyWRq3dtvv63CwsJxQwQAABxf0n6bJhgM6rHHHtMTTzyht956SzfccIOGh4dTn66pra1VY2NjavsbbrhBe/fu1U033aS3335bmzdv1n333afVq1fP3L0AAAAZK+2P9tbU1GhgYEBNTU2KRqMqKytTZ2dn6qLWvr4+uVwHGsfn8+nFF1/UzTffrGXLlqm4uFg33XSTbrvttpm7FwAAIGNlOY7jWA9xOPF4XB6PR0NDQ8rLy7MeBwCOKyUNm6d9jN6WFTMwCTLNZF+/+ds0AADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMDUlGKkra1NJSUlys3Nld/vV1dX14TbPv7448rKyhqz5ObmTnlgAAAwu6QdIx0dHQoGg2publZPT49KS0tVXV2t/v7+CffJy8vTnj17Usv7778/raEBAMDskXaMbNiwQatWrVJ9fb2WLl2q9vZ2zZkzR5s2bZpwn6ysLBUUFKQWr9c7raEBAMDskVaMjI6Oqru7W4FA4MABXC4FAgFFIpEJ9/voo490+umny+fz6Zvf/KbefPPNQ97OyMiI4vH4mAUAAMxOacXI4OCgEonEQWc2vF6votHouPucc8452rRpk/7whz/oqaeeUjKZ1MUXX6wPPvhgwtsJhULyeDypxefzpTMmAADIIEf80zRVVVWqra1VWVmZLr30Uj333HM69dRT9atf/WrCfRobGzU0NJRa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z50MMX/+fJ199tnauXOn9Sg4jP88p2KxmAoLC1PrY7GYysrKjKYa67iLkVNPPVWnnnrqjByrqqpK9957r/r7+7Vo0SJJ0ksvvaS8vDwtXbp0Rm4DB5vOY7ht2za5XK7U4wUbOTk5Ki8vVzgc1sqVKyVJyWRS4XBYN954o+1wmJSPPvpI7777rq677jrrUXAYZ5xxhgoKChQOh1PxEY/H9dprr034adGj7biLkXT09fVp79696uvrUyKR0LZt2yRJS5Ys0dy5c3XFFVdo6dKluu666/TAAw8oGo3qjjvu0OrVq4/pv454vIhEInrttdf0ta99TfPmzVMkEtHNN9+s7373u1qwYIH1eMe9YDCouro6VVRUqLKyUq2trRoeHlZ9fb31aBjHrbfeqquuukqnn366du/erebmZmVnZ+uaa66xHg36PA7/+yzVe++9p23btmnhwoU67bTT9OMf/1j33HOPzjrrLJ1xxhlau3atioqKUv8zYM764zzHsrq6OkfSQcvLL7+c2qa3t9e58sornZNOOsnJz893brnlFufTTz+1Gxop3d3djt/vdzwej5Obm+ucd955zn333ed88skn1qPhCw8//LBz2mmnOTk5OU5lZaXz17/+1XokTKCmpsYpLCx0cnJynOLiYqempsbZuXOn9Vj4wssvvzzu61VdXZ3jOJ9/vHft2rWO1+t13G638/Wvf93ZsWOH7dD/JctxHMcqhAAAAI67T9MAAIBjCzECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATP0/eUf5MG0IskQAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ob_rewards = [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]\n",
    "for i in range(len(ob_rewards)):\n",
    "    Z = update_dist(ob_rewards[i], torch.from_numpy(support).float(), \\\n",
    "    Z, lim=(vmin,vmax), gamma=0.7)\n",
    "plt.bar(support, Z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.6"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def dist_dqn(x,theta,aspace=3): #A\n",
    "    dim0,dim1,dim2,dim3 = 128,100,25,51 #B\n",
    "    t1 = dim0*dim1\n",
    "    t2 = dim2*dim1\n",
    "    theta1 = theta[0:t1].reshape(dim0,dim1) #C\n",
    "    theta2 = theta[t1:t1 + t2].reshape(dim1,dim2)\n",
    "    l1 = x @ theta1 #D\n",
    "    l1 = torch.selu(l1)\n",
    "    l2 = l1 @ theta2 #E\n",
    "    l2 = torch.selu(l2)\n",
    "    l3 = []\n",
    "    for i in range(aspace): #F\n",
    "        step = dim2*dim3\n",
    "        theta5_dim = t1 + t2 + i * step\n",
    "        theta5 = theta[theta5_dim:theta5_dim+step].reshape(dim2,dim3)\n",
    "        l3_ = l2 @ theta5 #G\n",
    "        l3.append(l3_)\n",
    "    l3 = torch.stack(l3,dim=1) #H\n",
    "    l3 = torch.nn.functional.softmax(l3,dim=2)\n",
    "    return l3.squeeze()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_target_dist(dist_batch,action_batch,reward_batch,support,lim=(-10,10),gamma=0.8):\n",
    "    nsup = support.shape[0]\n",
    "    vmin,vmax = lim[0],lim[1]\n",
    "    dz = (vmax-vmin)/(nsup-1.)\n",
    "    target_dist_batch = dist_batch.clone()\n",
    "    for i in range(dist_batch.shape[0]): #A\n",
    "        dist_full = dist_batch[i]\n",
    "        action = int(action_batch[i].item())\n",
    "        dist = dist_full[action]\n",
    "        r = reward_batch[i]\n",
    "        if r != -1: #B\n",
    "            target_dist = torch.zeros(nsup)\n",
    "            bj = np.round((r-vmin)/dz)\n",
    "            bj = int(np.clip(bj,0,nsup-1))\n",
    "            target_dist[bj] = 1.\n",
    "        else: #C\n",
    "            target_dist = update_dist(r,support,dist,lim=lim,gamma=gamma)\n",
    "        target_dist_batch[i,action,:] = target_dist #D\n",
    "        \n",
    "    return target_dist_batch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def lossfn(x,y):#A\n",
    "    loss = torch.Tensor([0.])\n",
    "    loss.requires_grad=True\n",
    "    for i in range(x.shape[0]): #B \n",
    "        loss_ = -1 *  torch.log(x[i].flatten(start_dim=0)) @ y[i].flatten(start_dim=0) #C\n",
    "        loss = loss + loss_\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fa3c1057070>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+uUlEQVR4nO3deXxU9b3/8ffMJJnsCVtWEgLKKvtqUOsWRevFWr0tVa4gVagtVDCtIlXgWhfUuqCVn9xaKe1VC+pVWzcoBlGRyBIWRZAgBoKEbEAy2SeZOb8/KCMjM5MEZjHh9Xw85pHkzPfM+X5nQubN9/s5Z0yGYRgCAAAIEXOoOwAAAM5uhBEAABBShBEAABBShBEAABBShBEAABBShBEAABBShBEAABBShBEAABBSYaHuQFs4nU6VlJQoLi5OJpMp1N0BAABtYBiGampqlJaWJrPZ+/xHhwgjJSUlysjICHU3AADAaTh48KB69uzp9f4OEUbi4uIkHR9MfHx8iHsDAADawmazKSMjw/U+7k2HCCMnlmbi4+MJIwAAdDCtlVhQwAoAAEKKMAIAAEKKMAIAAEKqQ9SMAADQHoZhqKWlRQ6HI9Rd6dQsFovCwsLO+LIbhBEAQKdit9t1+PBh1dfXh7orZ4Xo6GilpqYqIiLitB+DMAIA6DScTqeKiopksViUlpamiIgILpYZIIZhyG63q6KiQkVFRerbt6/PC5v5QhgBAHQadrtdTqdTGRkZio6ODnV3Or2oqCiFh4frwIEDstvtioyMPK3HoYAVANDpnO7/0NF+/niuebUAAEBItTuMfPTRR5o4caLS0tJkMpn05ptvtrrPunXrNHLkSFmtVp177rlavnz5aXQVAAB0Ru0OI3V1dRo2bJiWLFnSpvZFRUW65pprdOmll2r79u2aM2eObrvtNq1evbrdnQUAoLO65JJLNGfOnFB3wyWY/Wl3AevVV1+tq6++us3tly5dqt69e+uJJ56QJA0cOFDr16/XU089pQkTJrT38AAAwAu73X5Gp9iGSsBrRvLz85WTk+O2bcKECcrPz/e6T1NTk2w2m9sNIXTwoPTYY9KxY6HuCQB0Srfccos+/PBDPf300zKZTDKZTNq3b59uvfVW9e7dW1FRUerfv7+efvrpU/a77rrr9NBDDyktLU39+/eXJG3YsEHDhw9XZGSkRo8erTfffFMmk0nbt2937btz505dffXVio2NVXJysm6++WZVVlZ67c/+/fsDNv6An9pbWlqq5ORkt23Jycmy2WxqaGhQVFTUKfssWrRI999/f6C7hrZ6/HHpmWekyEjpjjtC3RsAaB/DkEJ1AbToaKkN1zl5+umnVVhYqMGDB+v3v/+9JKlLly7q2bOnXn31VXXr1k0bNmzQjBkzlJqaqp/+9KeuffPy8hQfH681a9ZIkmw2myZOnKgf/vCHevnll3XgwIFTlluqqqp02WWX6bbbbtNTTz2lhoYGzZ07Vz/96U+1du1aj/3p0aOHn56UU30vrzMyb9485ebmun622WzKyMgIYY/OcidmpmpqQtsPADgd9fVSbGxojl1bK8XEtNosISFBERERio6OVkpKimv7yf8x7927t/Lz8/XKK6+4hZGYmBj9+c9/di3PLF26VCaTSc8//7wiIyM1aNAgHTp0SNOnT3ft8+yzz2rEiBF6+OGHXduWLVumjIwMFRYWql+/fh77EygBDyMpKSkqKytz21ZWVqb4+HiPsyKSZLVaZbVaA901tJXT6f4VABAUS5Ys0bJly1RcXKyGhgbZ7XYNHz7crc2QIUPc6kT27NmjoUOHul2AbOzYsW777NixQx988IFiPYS0ffv2qV+/fv4dSCsCHkays7P17rvvum1bs2aNsrOzA31o+AthBEBHFh19fIYiVMc+TStWrNBvf/tbPfHEE8rOzlZcXJz+8Ic/aOPGjW7tYtow8/JdtbW1mjhxoh599NFT7ktNTT3tPp+udoeR2tpaffXVV66fi4qKtH37dnXt2lWZmZmaN2+eDh06pL/97W+SpNtvv13PPvus7r77bv385z/X2rVr9corr+idd97x3ygQWCc+9ZJPvwTQEZlMbVoqCbWIiAi3Txn+5JNPNH78eP3qV79ybdu3b1+rj9O/f3+9+OKLampqcq0ybN682a3NyJEj9X//93/KyspSWJjnKPDd/gRSu8+m2bJli0aMGKERI0ZIknJzczVixAgtWLBAknT48GEVFxe72vfu3VvvvPOO1qxZo2HDhumJJ57Qn//8Z07r7UiYGQGAgMvKytLGjRu1f/9+VVZWqm/fvtqyZYtWr16twsJCzZ8//5RQ4clNN90kp9OpGTNmaPfu3Vq9erUef/xxSXJ9aODMmTN19OhR3Xjjjdq8ebP27dun1atXa9q0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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "aspace = 3 #A\n",
    "tot_params = 128*100 + 25*100 + aspace*25*51 #B\n",
    "theta = torch.randn(tot_params)/10. #C\n",
    "theta.requires_grad=True\n",
    "theta_2 = theta.detach().clone() #D\n",
    "#\n",
    "vmin,vmax= -10,10\n",
    "gamma=0.9\n",
    "lr = 0.00001\n",
    "update_rate = 75 #E\n",
    "support = torch.linspace(-10,10,51)\n",
    "state = torch.randn(2,128)/10. #F\n",
    "action_batch = torch.Tensor([0,2]) #G\n",
    "reward_batch = torch.Tensor([0,10]) #H\n",
    "losses = [] \n",
    "pred_batch = dist_dqn(state,theta,aspace=aspace) #I\n",
    "target_dist = get_target_dist(pred_batch,action_batch,reward_batch, \\\n",
    "                                 support, lim=(vmin,vmax),gamma=gamma) #J\n",
    "\n",
    "plt.plot((target_dist.flatten(start_dim=1)[0].data.numpy()),color='red',label='target')\n",
    "plt.plot((pred_batch.flatten(start_dim=1)[0].data.numpy()),color='green',label='pred')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fa3c0dc7850>]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in range(1000):\n",
    "    reward_batch = torch.Tensor([0,8]) + torch.randn(2)/10.0 #A\n",
    "    pred_batch = dist_dqn(state,theta,aspace=aspace) #B\n",
    "    pred_batch2 = dist_dqn(state,theta_2,aspace=aspace) #C\n",
    "    target_dist = get_target_dist(pred_batch2,action_batch,reward_batch, \\\n",
    "                                 support, lim=(vmin,vmax),gamma=gamma) #D\n",
    "    loss = lossfn(pred_batch,target_dist.detach()) #E\n",
    "    losses.append(loss.item())\n",
    "    loss.backward()\n",
    "    # Gradient Descent\n",
    "    with torch.no_grad():\n",
    "        theta -= lr * theta.grad\n",
    "    theta.requires_grad = True\n",
    "    \n",
    "    if i % update_rate == 0: #F \n",
    "        theta_2 = theta.detach().clone()\n",
    "\n",
    "plt.plot((target_dist.flatten(start_dim=1)[0].data.numpy()),color='red',label='target')\n",
    "plt.plot((pred_batch.flatten(start_dim=1)[0].data.numpy()),color='green',label='pred')\n",
    "plt.plot(losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.11"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tpred = pred_batch\n",
    "cs = ['gray','green','red']\n",
    "num_batch = 2\n",
    "labels = ['Action {}'.format(i,) for i in range(aspace)]\n",
    "fig,ax = plt.subplots(nrows=num_batch,ncols=aspace)\n",
    "\n",
    "for j in range(num_batch): #A \n",
    "    for i in range(tpred.shape[1]): #B\n",
    "        ax[j,i].bar(support.data.numpy(),tpred[j,i,:].data.numpy(),\\\n",
    "                label='Action {}'.format(i),alpha=0.9,color=cs[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.12"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def preproc_state(state):\n",
    "    p_state = torch.from_numpy(state).unsqueeze(dim=0).float()\n",
    "    p_state = torch.nn.functional.normalize(p_state,dim=1) #A\n",
    "    return p_state\n",
    "\n",
    "def get_action(dist,support):\n",
    "    actions = []\n",
    "    for b in range(dist.shape[0]): #B\n",
    "        expectations = [support @ dist[b,a,:] for a in range(dist.shape[1])] #C\n",
    "        action = int(np.argmax(expectations)) #D\n",
    "        actions.append(action)\n",
    "    actions = torch.Tensor(actions).int()\n",
    "    return actions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.13"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/don/git/DeepReinforcementLearningInAction/venv/lib/python3.10/site-packages/gym/envs/registration.py:307: DeprecationWarning: The package name gym_minigrid has been deprecated in favor of minigrid. Please uninstall gym_minigrid and install minigrid with `pip install minigrid`. Future releases will be maintained under the new package name minigrid.\n",
      "  fn()\n",
      "A.L.E: Arcade Learning Environment (version 0.8.1+53f58b7)\n",
      "[Powered by Stella]\n",
      "/home/don/git/DeepReinforcementLearningInAction/venv/lib/python3.10/site-packages/gymnasium/core.py:311: UserWarning: \u001b[33mWARN: env.get_action_meanings to get variables from other wrappers is deprecated and will be removed in v1.0, to get this variable you can do `env.unwrapped.get_action_meanings` for environment variables or `env.get_wrapper_attr('get_action_meanings')` that will search the reminding wrappers.\u001b[0m\n",
      "  logger.warn(\n"
     ]
    }
   ],
   "source": [
    "import gymnasium as gym\n",
    "from collections import deque\n",
    "env = gym.make('ALE/Freeway-ram-v5')\n",
    "aspace = 3\n",
    "env.env.get_action_meanings()\n",
    "\n",
    "vmin,vmax = -10,10\n",
    "replay_size = 200\n",
    "batch_size = 50\n",
    "nsup = 51\n",
    "dz = (vmax - vmin) / (nsup-1)\n",
    "support = torch.linspace(vmin,vmax,nsup)\n",
    "\n",
    "replay = deque(maxlen=replay_size) #A\n",
    "lr = 0.0001 #B \n",
    "gamma = 0.1 #C \n",
    "epochs = 1300\n",
    "eps = 0.20 #D starting epsilon for epsilon-greedy policy\n",
    "eps_min = 0.05 #E ending epsilon\n",
    "priority_level = 5 #F \n",
    "update_freq = 25 #G \n",
    "\n",
    "#Initialize DQN parameter vector\n",
    "tot_params = 128*100 + 25*100 + aspace*25*51  #H \n",
    "theta = torch.randn(tot_params)/10. #I \n",
    "theta.requires_grad=True\n",
    "theta_2 = theta.detach().clone() #J \n",
    "\n",
    "losses = []\n",
    "cum_rewards = [] #K \n",
    "renders = []\n",
    "state = preproc_state(env.reset()[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 7.14"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from random import shuffle\n",
    "for i in range(epochs):\n",
    "    pred = dist_dqn(state,theta,aspace=aspace)\n",
    "    if i < replay_size or np.random.rand(1) < eps: #A\n",
    "        action = np.random.randint(aspace)\n",
    "    else:\n",
    "        action = get_action(pred.unsqueeze(dim=0).detach(),support).item()\n",
    "    state2, reward, done, info, _ = env.step(action) #B\n",
    "    state2 = preproc_state(state2)\n",
    "    if reward == 1: cum_rewards.append(1) \n",
    "    reward = 10 if reward == 1 else reward #C\n",
    "    reward = -10 if done else reward #D\n",
    "    reward = -1 if reward == 0 else reward #E\n",
    "    exp = (state,action,reward,state2) #F\n",
    "    replay.append(exp) #G\n",
    "    \n",
    "    if reward == 10: #H\n",
    "        for e in range(priority_level):\n",
    "            replay.append(exp)\n",
    "            \n",
    "    shuffle(replay)\n",
    "    state = state2\n",
    "\n",
    "    if len(replay) == replay_size: #I\n",
    "        indx = np.random.randint(low=0,high=len(replay),size=batch_size)\n",
    "        exps = [replay[j] for j in indx]\n",
    "        state_batch = torch.stack([ex[0] for ex in exps],dim=1).squeeze()\n",
    "        action_batch = torch.Tensor([ex[1] for ex in exps])\n",
    "        reward_batch = torch.Tensor([ex[2] for ex in exps])\n",
    "        state2_batch = torch.stack([ex[3] for ex in exps],dim=1).squeeze()\n",
    "        pred_batch = dist_dqn(state_batch.detach(),theta,aspace=aspace)\n",
    "        pred2_batch = dist_dqn(state2_batch.detach(),theta_2,aspace=aspace)\n",
    "        target_dist = get_target_dist(pred2_batch,action_batch,reward_batch, \\\n",
    "                                     support, lim=(vmin,vmax),gamma=gamma)\n",
    "        loss = lossfn(pred_batch,target_dist.detach())\n",
    "        losses.append(loss.item())\n",
    "        loss.backward()\n",
    "        with torch.no_grad(): #J\n",
    "            theta -= lr * theta.grad\n",
    "        theta.requires_grad = True\n",
    "        \n",
    "    if i % update_freq == 0: #K\n",
    "        theta_2 = theta.detach().clone()\n",
    "        \n",
    "    if i > 100 and eps > eps_min: #L\n",
    "        dec = 1./np.log2(i)\n",
    "        dec /= 1e3\n",
    "        eps -= dec\n",
    "    \n",
    "    if done: #M\n",
    "        state = preproc_state(env.reset())\n",
    "        done = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f41fca5f850>]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(losses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
